package vip.zhenzicheng.algorithm.leetcode.str;

/**
 * <a href="https://leetcode.cn/problems/string-to-integer-atoi/">字符串转换整数（atoi） [中等]</a>
 *
 * @author zhenzicheng
 * @date 2022-07-26 09:57
 */
public class StringToIntegerAtoi_8 {

  public static void main(String[] args) {
    StringToIntegerAtoi_8 test = new StringToIntegerAtoi_8();
    System.out.println(test.myAtoi("-91283472332"));
    System.out.println(Integer.MIN_VALUE);
  }

  public int myAtoi(String s) {
    int len = s.length();
    char[] charArray = s.toCharArray();
    int idx = 0;

    // 检查空格
    while (idx < len && charArray[idx] == ' ') {
      idx++;
    }

    // 都是空格？
    if (idx == len) {
      return 0;
    }

    // 尝试获取符号
    int sign = 1; // 符号位
    char firstChar = charArray[idx];
    if (firstChar == '+') {
      idx++;
    } else if (firstChar == '-') {
      sign = -1;
      idx++;
    }

    // 读取后续数字
    int result = 0;
    while (idx < len) {
      char c = charArray[idx];
      // 出现非数字直接终止
      if (c < '0' || c > '9') {
        break;
      }

      // 提前判断是否最大溢出
      int nextMaxValue = Integer.MAX_VALUE / 10;
      if (result > nextMaxValue || (result == nextMaxValue && (c - '0') > Integer.MAX_VALUE % 10)) {
        return Integer.MAX_VALUE;
      }
      // 提前判断是否最小溢出
      int nextMinValue = Integer.MIN_VALUE / 10;
      if (result < nextMinValue || (result == nextMinValue && (c - '0') > -(Integer.MIN_VALUE % 10))) {
        return Integer.MIN_VALUE;
      }

      // 转换
      result = result * 10 + sign * (c - '0');
      idx++;
    }
    // return sign * result; // 如果直接在结果位做处理可能刚好是Integer.MIN_VALUE，然后取反后导致正数最大值溢出
    return result;
  }
}
